home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1996 February: Tool Chest / Apple Developer CD Series Tool Chest February 1996 (Apple Computer)(1996).iso / Sample Code / AOCE Sample Code / PowerTalk Access Modules / Sample SMSAM / SampleSMSAM Source / BuildingBlocks / HandleObject.cp < prev    next >
Encoding:
Text File  |  1995-07-28  |  5.3 KB  |  235 lines  |  [TEXT/MPS ]

  1. /*
  2.     File:        HandleObject.cp
  3.  
  4.     Copyright:    © 1991-1994 by Apple Computer, Inc.
  5.                 All rights reserved.
  6.  
  7.     Part of the AOCE Sample SMSAM Package.  Consult the license
  8.     which came with this software for your specific legal rights.
  9.  
  10. */
  11.  
  12.  
  13.  
  14. #ifndef __HANDLEOBJECT__
  15. #include "HandleObject.h"
  16. #endif
  17.  
  18. #ifndef    __DEBUGASSERT__
  19. #include "DebugAssert.h"
  20. #endif
  21.  
  22. #ifndef    __IOSTREAM__
  23. #include "IOStream.h"
  24. #endif
  25.  
  26. /***********************************|****************************************/
  27.  
  28. #pragma segment HandleObject
  29.  
  30. /***********************************|****************************************/
  31.  
  32. ostream& operator << ( ostream& s, const THandleObject* o )
  33. {
  34.     if ( o )
  35.         return *o >> s;
  36.     else
  37.         return s << "<NIL>";
  38. }
  39.  
  40. /***********************************|****************************************/
  41.  
  42. THandleObject::THandleObject () 
  43. {
  44. #if defined ( debug )
  45.     fTag = kHandleObjectTag;
  46. #endif
  47. }
  48.  
  49. /***********************************|****************************************/
  50.  
  51. THandleObject::THandleObject ( const THandleObject& ) 
  52. {
  53. #if defined ( debug )
  54.     fTag = kHandleObjectTag;
  55. #endif
  56. }
  57.  
  58. /***********************************|****************************************/
  59.  
  60. THandleObject::~THandleObject() {
  61.     #if debug
  62.     fTag = '\?\?\?\?';
  63.     #endif
  64. }
  65.  
  66. /***********************************|****************************************/
  67.  
  68. ostream& THandleObject::operator >> ( ostream& s ) const
  69. {
  70.     return s << "THandleObject @ " << (void*) this;
  71. }
  72.  
  73. /***********************************|****************************************/
  74.  
  75. THandleObject& THandleObject::operator = ( const THandleObject& that )
  76. {
  77.     ASSERT ( this != &that ); 
  78.     return *this;
  79. }
  80.  
  81. /***********************************|****************************************/
  82.  
  83. THandleObject::THandleObject ( Boolean lock )
  84. {
  85. #if defined ( ENABLE_HANDLE_OBJECTS)
  86.     if ( lock )
  87.         Lock ();
  88. #endif
  89. }
  90.  
  91. /***********************************|****************************************/
  92.  
  93. SignedByte THandleObject::GetState()
  94. {
  95. #if defined ( ENABLE_HANDLE_OBJECTS)
  96.     return HGetState((Handle)this);
  97. #else
  98.     return 0;
  99. #endif
  100. }
  101.  
  102. /***********************************|****************************************/
  103.  
  104. void THandleObject::Lock()
  105. #if defined ( ENABLE_HANDLE_OBJECTS)
  106.     HLock((Handle)this);
  107. #endif
  108. }
  109.  
  110. /***********************************|****************************************/
  111.  
  112. void THandleObject::MoveHigh() 
  113. {
  114. #if defined ( ENABLE_HANDLE_OBJECTS)
  115.     MoveHHi((Handle)this);
  116. #endif
  117. }
  118.  
  119. /***********************************|****************************************/
  120.  
  121. void THandleObject::SetState(SignedByte flags) 
  122. {
  123. #if defined ( ENABLE_HANDLE_OBJECTS)
  124.     HSetState((Handle)this, flags);
  125. #endif
  126. }
  127.  
  128. /***********************************|****************************************/
  129.  
  130. void THandleObject::Unlock() 
  131. {
  132. #if defined ( ENABLE_HANDLE_OBJECTS)
  133.     HUnlock((Handle)this);
  134. #endif
  135. }
  136.  
  137. /***********************************|****************************************/
  138.  
  139. SignedByte THandleObject::LockHigh()  { 
  140. #if defined ( ENABLE_HANDLE_OBJECTS )
  141.     SignedByte oldState = GetState();
  142.     MoveHigh();
  143.     Lock();
  144.     return oldState; 
  145. #else
  146.     return 0;
  147. #endif
  148. }
  149.  
  150. /***********************************|****************************************/
  151.  
  152. #if defined ( debug )
  153.  
  154. Boolean THandleObject::IsAHandleObject ( Handle h )
  155. {    
  156.     THandleObject* o = (THandleObject *) h;
  157.  
  158.     return o->fTag == kHandleObjectTag;
  159. }
  160.  
  161. #endif
  162.  
  163. /***********************************|****************************************/
  164.  
  165. #if defined ( debug )
  166.  
  167. Boolean foo ()  { return true; }
  168. Boolean foo2 ( ) { return false; }
  169.  
  170. Boolean THandleObject::IsValidObject ( Boolean mustReturn ) const
  171. {
  172.     #if defined ( ENABLE_HANDLE_OBJECTS )
  173.     Handle h = (Handle) this;
  174.  
  175.     if (     ( ( (long) h ) & 0x00000001 ) ||                    //    If the handle master is odd,
  176.             ( h < (Handle) & ( ApplicZone ()->heapData ) ) ||    //    or below the application zone
  177.             ( h > (Handle) ApplicZone()->bkLim ) )                //    or above the application zone
  178.     {
  179.         keith << "THandleObject::IsValidObject(), bad object master pointer." << endl;
  180.     }
  181.     else if ( ( ( (long) *h ) & 0x00000001 ) ||                    //    If the object pointer is odd,
  182.             ( *h < (Ptr) & ( ApplicZone ()->heapData ) ) ||        //    or below the application zone
  183.             ( *h > ApplicZone()->bkLim ) )                        //    or above the application zone
  184.     {
  185.         keith << "THandleObject::IsValidObject(), bad object pointer." << endl;
  186.     }
  187.     else if ( fTag != kHandleObjectTag )
  188.     {    
  189.         keith << "THandleObject::IsValidObject(), fTag != kHandleObjectTag." << endl;
  190.     }
  191.     else
  192.     {
  193.         return true;
  194.     }
  195.     
  196.     //    If we get here, the object is bad, so print out a stack crawl,
  197.     //    call Failure() for the current thread, and exit.
  198.     if ( ! mustReturn )
  199.         FAIL ( -1 );
  200.     
  201.     return false;
  202.  
  203.     #else    // ENABLE_HANDLE_OBJECTS
  204.     Ptr p = (Ptr) this;
  205.  
  206.     if ( ( ( (long) p ) & 0x00000001 ) ||                                //    If the object pointer is odd,
  207.             ( p < (Ptr) & ( ApplicZone ()->heapData ) ) ||    //    or below the application zone
  208.             ( p > ApplicZone()->bkLim ) )                    //    or above the application zone
  209.     {
  210.         keith << "THandleObject::IsValidObject(), bad object pointer." << endl;
  211.     }
  212.     else if ( fTag != kHandleObjectTag )
  213.     {    
  214.         keith << "THandleObject::IsValidObject(), fTag != kHandleObjectTag." << endl;
  215.     }
  216.     else
  217.     {
  218.         return true;
  219.     }
  220.     
  221.     //    If we get here, the object is bad, so print out a stack crawl,
  222.     //    call Failure() for the current thread, and exit.
  223.     if ( ! mustReturn )    
  224.         FAIL ( -1 );
  225.     
  226.     return false;
  227.     
  228.     #endif    // ENABLE_HANDLE_OBJECTS
  229. }
  230.  
  231. #endif
  232.  
  233. /***********************************|****************************************/
  234.